筆記目錄

Skip to content

使用 .NET Framework 將資訊寫入 Windows 事件記錄檔

簡介

在 .NET Framework 中,我們可以使用 System.Diagnostics.EventLog 這個類別來處理與 Windows 事件記錄檔相關的操作。EventLog 有兩個主要參數,分別是 Source 和 LogName。

  • Source(來源):通常用來標示應用程式名稱。如果你要寫入事件記錄檔,建議先檢查該來源是否已存在,如果不存在,可以使用 EventLog.CreateEventSource(source, logName) 方法來建立新的來源。

eventlog source property

  • LogName(記錄檔名稱):指定要寫入來源專案的記錄檔名稱。同一個 Source 只能與一個 LogName 建立關聯。

eventlog logname property

程式碼範例

以下是一個簡單的程式碼範例,用於將訊息寫入事件記錄檔:

csharp
string source = "MySource";

// 檢核 Source 是否存在,不存在就建立 Source
if (!EventLog.SourceExists(source)) {
    // LogName 可以寫 Application 或 應用程式 都會關聯到應用程式那邊
    EventLog.CreateEventSource(source, "Application");
}

// 寫入訊息
EventLog.WriteEntry(source, "MyMessage");

// 也可以這樣寫
using (EventLog log = new EventLog()) {
    log.Source = source;
    log.WriteEntry("MyMessage");
}

執行結果:

event viewer application log

TIP

WriteEntry() 方法還有其他可選用的參數,例如 EventLogEntryTypeEventID,可用於對應事件檢視器中的「等級」和「事件識別碼」等屬性。有關這些參數的對應關係,可以在查閱相關資料時得知,此處不做特別說明。

也可以自訂記錄檔名稱,如下面程式碼所示,將 LogName 定義為 MyLogName

csharp
// MySource 已經使用過,所以這邊改 MySource2
string source = "MySource2";

if (!EventLog.SourceExists(source)) {
    EventLog.CreateEventSource(source, "MyLogName");
}

EventLog.WriteEntry(source, "MyMessage");

執行結果:

event viewer custom log

WARNING

要重開事件檢視器才可以看到新的記錄檔。

如果想要更改 Source 所綁定的 LogName,可以先使用 Source,然後再重新建立新的關聯。

csharp
string source = "MySource";
string logName = "MyLogName";

if (EventLog.SourceExists(source)) {
    string oldLogName = EventLog.LogNameFromSourceName(source, ".");
    if (oldLogName != logName) {
        EventLog.DeleteEventSource(source);
        EventLog.CreateEventSource(source, logName);
    }
} else {
    EventLog.CreateEventSource(source, logName);
}

EventLog.WriteEntry(source, "MyMessage");

WARNING

以上程式碼是從 MSDN 上修改來的,你可能以為可以順利的重新關聯 Source 與記錄檔,但實際上會發現寫入的訊息還是寫到舊的記錄檔裡面,仔細看文件會發現還有以下備註說明:

如果來源已經對應到記錄檔,而且您重新將它對應到新的記錄檔,您必須重新開機電腦,變更才會生效

如果要刪除記錄檔,可以使用 EventLog.Delete(logName) 刪除指定的記錄檔。

參考資料

MSDN EventLog 類別

異動歷程

  • 2023-08-04 初版文件建立。